/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package com.myapp.struts.TablasEquivalencias;

import BD.BaseDatos;
import com.myapp.struts.Materia.Materia;
import java.sql.ResultSet;
import java.util.LinkedList;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;

/**
 *
 * @author Andreina Wilhelm
 */
public class SeleccionarListaTablasEquivalenciaAction extends org.apache.struts.action.Action {
    
    /* forward name="success" path="" */
    private static final String SUCCESS = "success";
    private static final String FAILURE = "failure";

    /**
     * This is the action called from the Struts framework.
     *
     * @param mapping The ActionMapping used to select this instance.
     * @param form The optional ActionForm bean for this request.
     * @param request The HTTP Request we are processing.
     * @param response The HTTP Response we are processing.
     * @throws java.lang.Exception
     * @return
     */
    @Override
    public ActionForward execute(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {

        // crea instancia de BD
        BaseDatos bd = new BaseDatos();

        SeleccionarListaTablasEquivalenciaForm sltef = (SeleccionarListaTablasEquivalenciaForm) form;
        
        // obtengo de sesion el form de listaMaterias
        HttpSession sesion = request.getSession();
        SeleccionarListaMateriasForm slmf = (SeleccionarListaMateriasForm) sesion.getAttribute("SeleccionarListaMateriasForm");

        // extraigo los ID's de intituciones y carreras
        String idIntsOrig = slmf.getID_InstOrigen();
        String idIntsDest = slmf.getID_InstDestino();
        String idCarreraOrig = slmf.getID_CarreraOrigen();
        String idCarreraDest = slmf.getID_CarreraDestino();
        
        try {
            // establece conexion con BD
            bd.establecerConexion();

            // se crea el query. Primero ordeno las materias euivalentes por los id's de las matDestino. Puedo hacer equivalencias 2:1
            String query = "CREATE TEMP TABLE tablaEqui AS SELECT * FROM tablaEquivalencias ORDER BY idmatdestino";              
            // se ejecuta query
            boolean result = bd.updateQuery(query);            
            
            
            // Obtengo las materias equivalentes
            String query1 = "SELECT * FROM materia INNER JOIN  tablaEqui ON tablaEqui.idMatOrigen = materia.codigo OR tablaEqui.idMatDestino = materia.codigo WHERE  tablaEqui.idInstOrigen='"+idIntsOrig+"' AND tablaEqui.idCarrOrigen='"+idCarreraOrig+"' AND tablaEqui.idInstDestino='"+idIntsDest+"' AND tablaEqui.idCarrDestino='"+idCarreraDest+"'";              
            // se ejecuta query
            ResultSet rs = bd.ejecutarQuery(query1);
            
            
            // creo lista de materias equivalentes
            Materia matOrig, matDest;
            LinkedList<MateriasEquivalentes> tablasEquiv = new LinkedList<MateriasEquivalentes>();

            // La primera materia es la origen y la siguiente es la destino
            while (rs.next()) {
                matOrig = new Materia(rs.getString("codigo"), rs.getString("nombre"), Integer.parseInt(rs.getString("nroCreditos")), Integer.parseInt(rs.getString("ano")), rs.getString("codigoCarrera"), Integer.parseInt(rs.getString("idInstitucion")));
                rs.next();
                matDest = new Materia(rs.getString("codigo"), rs.getString("nombre"), Integer.parseInt(rs.getString("nroCreditos")), Integer.parseInt(rs.getString("ano")), rs.getString("codigoCarrera"), Integer.parseInt(rs.getString("idInstitucion")));

                tablasEquiv.add(new MateriasEquivalentes(rs.getString("idTabEqui"), matOrig, matDest));
            }
            sltef.setTablasEquiv(tablasEquiv);

            // Se termina conexion con BD
            bd.terminarConexion();

            return mapping.findForward(SUCCESS);

        } catch (Exception e) {
            System.out.println("ERROR: Problema al consultar la BD");
        }

        // Se termina conexion con BD
        bd.terminarConexion();
            
        return mapping.findForward(FAILURE);
    }
}
